# encoding: utf-8
# 函数式编程

# 高阶函数 Higher-order function 可以接受函数作为参数的函数


# map/reduce
# map 对序列中的每一个元素执行相同的函数
def power(x):
    return x * x


print map(power, [2, 3, 4, 7])

strLis = ['adam', 'LISA', 'barT', '']


def UAndL(x):
    return x[0:1].upper() + x[1:].lower()


print map(UAndL, strLis)


# reduce 对序列中的每一个元素执行相同的函数 函数有两个参数
def prod(lis):
    def Add(a, b):
        return a + b
    return reduce(Add, lis)

print prod([1, 1, 2, 3, 6])


# filter 用于过滤序列 会保留使函数返回true的项
def is_odd(n):
    return n % 2 == 1


print filter(is_odd, [9, 8, 3, 4, 5, 643, 53, 5, 213, 2, 4])


# sorted 排序
print(sorted(["A01","B03", "A10", "A19", 'A110']))
def sort_word(x,y):
    u1 = x[0:1].upper()
    u2 = y[0:1].upper()
    i1 = int(x[1])
    i2 = int(y[1])
    if u1>u2:
        return 1
    elif u2>u1:
        return -1
    elif i1>i2:
        return 1
    elif i2>i1:
        return -1
    else:
        return 0
print(sorted(["A01","B03", "A10", "A19", 'A110'],sort_word))


# 返回函数 闭包
def outer():
    def f_inner(j):
        return j * j
    return f_inner
print outer()
print outer()(5)


# 匿名函数 lambda表达式

f = lambda x: x+x #只支持一句表达式
print(f)
print f(100)


# 装饰器 语言原生支持拦截器
def logger(func):
    def warpper(*args,**kwargs):
        print 'call %s():' % func.__name__
        return func(*args,**kwargs)
    return warpper


@logger
def now():
    print '2012-03-01'
f = now
print 'the funcion name is', f.__name__
print( now())

# 偏函数
import functools
def end_list(lis, with_end = True):
    if with_end:
        lis.append("end!")
    return lis
lis2 = functools.partial(end_list,with_end = False)

print end_list(['a','n'])
print(lis2(['a','n']))